package com.demo.consumer;

import java.net.InetAddress;
import java.util.UUID;

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.slf4j.MDC;

import lombok.extern.slf4j.Slf4j;

/**
 * Kafka消费者抽象实现定义
 * 
 * @Description:
 * @author: fanfan
 */
@Slf4j
public abstract class KafkaConsumer<K, V> {

	/**
	 * 通用拉kafka消息，可以自行定义groupId,topic
	 * 
	 * @param record
	 */
	public void consume(ConsumerRecord<K, V> record) {
		MDC.put("traceId", UUID.randomUUID().toString());
		try {
			executeRecord(record);
		} catch (Exception e) {
			// 这里异常要捕获，不能再次抛出，因为Kafka默认是自动 提交offset<br>
			log.error(e.getMessage(), e);
		}
	}

	/**
	 * 拉下消息后的业务实现<br>
	 * 这里方法定义最好使用显示的protected修饰
	*/
	protected abstract void executeRecord(ConsumerRecord<K, V> record);

	// 获取本机IP地址
	public static String getInNetIp() {
		String ip = "";
		try {
			ip = InetAddress.getLocalHost().getHostAddress();
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		return ip;
	}

}
